/**
 * @param {number} N
 * @return {number}
 * f(0) = 0 
 * f(1) = 1
 * f(2) = 1
 * f(3) = 2
 * f(4) = 3
 */
var fib = function(N) {
  var cache = new Map(); // 这里我们使用闭包，让内部函数访问到这个变量
  var result
  var goFib = function (N) {
    if (cache.has(N)) {
      return cache.get(N)
    }
    if (N < 2) {
      result = N
    } else {
      result = goFib(N - 2) + goFib(N - 1)
    }
    cache.set(N, result)
    return result
  }
  return goFib(N)
};

console.log(fib(5))